/**
 * 
 */
package beans;


import java.awt.Color;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.List;

import javax.el.ValueExpression;
import javax.faces.component.html.HtmlColumn;
import javax.faces.component.html.HtmlDataTable;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.context.FacesContext;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;

import dao.DAO;
import dao.DAOGenerico;

import logica.Cadenahotel;
import logica.Convenio;

/**
 * @author ALEJA CHICA
 *
 */
public class ConvenioBean 

{

	private int idconvenio;
	private Cadenahotel cadenahotel;
	private String nombreagencia;
	private Integer nit;
	private String descripcionconvenio;
	private String representanteconvenio;
	private Date fechaingreso;
	private Date periododuracion;
	private List<Convenio> convenios;
	
	public List<Convenio> getConvenios() {
		return convenios;
	}

	public void setConvenios(List<Convenio> convenios) {
		this.convenios = convenios;
	}

	Convenio convenio;
	
	public Convenio getConvenio() {
		return convenio;
	}

	public void setConvenio(Convenio convenio) {
		this.convenio = convenio;
	}

	public int getIdconvenio() {
		return this.idconvenio;
	}

	public void setIdconvenio(int idconvenio) {
		this.idconvenio = idconvenio;
	}

	public Cadenahotel getCadenahotel() {
		return this.cadenahotel;
	}

	public void setCadenahotel(Cadenahotel cadenahotel) {
		this.cadenahotel = cadenahotel;
	}

	public String getNombreagencia() {
		return this.nombreagencia;
	}

	public void setNombreagencia(String nombreagencia) {
		this.nombreagencia = nombreagencia;
	}

	public Integer getNit() {
		return this.nit;
	}

	public void setNit(Integer nit) {
		this.nit = nit;
	}

	public String getDescripcionconvenio() {
		return this.descripcionconvenio;
	}

	public void setDescripcionconvenio(String descripcionconvenio) {
		this.descripcionconvenio = descripcionconvenio;
	}

	public String getRepresentanteconvenio() {
		return this.representanteconvenio;
	}

	public void setRepresentanteconvenio(String representanteconvenio) {
		this.representanteconvenio = representanteconvenio;
	}

	public Date getFechaingreso() 
	{
		return this.fechaingreso;
	}

	public void setFechaingreso(Date fechaingreso) 
	{
		
		this.fechaingreso = fechaingreso;
	}

	public Date getPeriododuracion() 
	{
		
		return this.periododuracion;
	}

	public void setPeriododuracion(Date periododuracion) 
	{
		
		this.periododuracion = periododuracion;
	}

	
	public String crearConvenio()
	{
		
		try
		{
			DAO<Convenio> daoConvenio = new DAOGenerico<Convenio>(Convenio.class);
			Convenio convenio= new Convenio();			
			Cadenahotel cadenahotel=new Cadenahotel();	
						
			cadenahotel.setIdcadenahotel(1);
			convenio.setCadenahotel(cadenahotel);
			convenio.setDescripcionconvenio(this.getDescripcionconvenio());
			convenio.setFechaingreso(getFechaingreso());
			convenio.setNit(getNit());
			convenio.setNombreagencia(getNombreagencia());
			convenio.setPeriododuracion(getPeriododuracion());
			convenio.setRepresentanteconvenio(getRepresentanteconvenio());
			convenio.setIdconvenio(getIdconvenio());
			daoConvenio.persist(convenio);
			
			return "ini";
		}
		catch (Exception e)
		{
			return "no";
		}
		
	}
	
	public String modificarConvenio()
	{
		
		try
		{
			DAO<Convenio> daoConvenio = new DAOGenerico<Convenio>(Convenio.class);
			Convenio convenio= new Convenio();			
			Cadenahotel cadenahotel=new Cadenahotel();	
						
			cadenahotel.setIdcadenahotel(1);
			convenio.setCadenahotel(cadenahotel);
			convenio.setIdconvenio(getIdconvenio());
			convenio.setDescripcionconvenio(this.getDescripcionconvenio());
			convenio.setFechaingreso(getFechaingreso());
			convenio.setNit(getNit());
			convenio.setNombreagencia(getNombreagencia());
			convenio.setPeriododuracion(getPeriododuracion());
			convenio.setRepresentanteconvenio(getRepresentanteconvenio());
			convenio.setIdconvenio(getIdconvenio());
			daoConvenio.merge(convenio);
			
			return "ini";
		}
		catch (Exception e)
		{
			return "no";
		}
		
	}
	
	public String elminarConvenio()
	{
		
		try
		{
			DAO<Convenio> daoConvenio = new DAOGenerico<Convenio>(Convenio.class);
			Convenio convenio= new Convenio();			
			Cadenahotel cadenahotel=new Cadenahotel();			
			cadenahotel.setIdcadenahotel(1);
			convenio.setCadenahotel(cadenahotel);
			convenio.setIdconvenio(this.getIdconvenio());
			convenio.setNit(this.getNit());
			convenio.setNombreagencia(this.getNombreagencia());
			convenio.setRepresentanteconvenio(this.getRepresentanteconvenio());
			convenio.setIdconvenio(this.getIdconvenio());
			
			Convenio convenioRec= daoConvenio.findById(this.getIdconvenio());
			
			
			daoConvenio.delete(convenioRec);
			
			return "ini";
		}
		catch (Exception e)
		{
			return "no";
		}
		
	}
	
	private List<Convenio> listarConvenio() 
	{
		
		DAO<Convenio> daoConvenio = new DAOGenerico<Convenio>(Convenio.class);
		Convenio convenio = new Convenio();
		
		return  daoConvenio.findByExample(convenio);
	}
	
	public String listarConvenios()
	{
		convenios=listarConvenio();
		return "usu";
	}
	
	private HtmlDataTable datos;

	public HtmlDataTable getDatos() 
	{
		poblarDataTable();
		return datos;
	}

	public void setDatos(HtmlDataTable datos) 
	{
		this.datos = datos;
	}
	
	private void poblarDataTable()
	{

		datos = new HtmlDataTable();
		datos.setValueExpression("value", createValueExpression("#{myBean.dataList}", List.class));
		datos.setVar("item");
		datos.setBgcolor("silver");	

		
		HtmlColumn idConColumn = new HtmlColumn();
		datos.getChildren().add(idConColumn);

		// Create <h:outputText value="#{dataItem.name}"> for the body of 'Name'
		// column.
		HtmlOutputText idConOutput = new HtmlOutputText();
		idConOutput.setValueExpression("value", createValueExpression("#{item.idconvenio}", Integer.class));
		idConColumn.getChildren().add(idConOutput);

		// Create <h:column> for 'Value' column.
		HtmlColumn codidoRolColumn = new HtmlColumn();
		datos.getChildren().add(codidoRolColumn);

		
		// Create <h:outputText value="#{dataItem.value}"> for the body of
		// 'Value' column.
		HtmlOutputText nameOutput = new HtmlOutputText();
		nameOutput.setValueExpression("value", createValueExpression("#{item. nombreagencia}", String.class));
		codidoRolColumn.getChildren().add(nameOutput);
		
		/*
		 * 
		 */
		
		HtmlColumn nombreColumn = new HtmlColumn();
		datos.getChildren().add(nombreColumn);
		
		HtmlOutputText cedulaOutput = new HtmlOutputText();
		cedulaOutput.setValueExpression("value", createValueExpression("#{item.nit}", Integer.class));
		nombreColumn.getChildren().add(cedulaOutput);
		
		/*
		 * 
		 */
		
		HtmlColumn descColumn = new HtmlColumn();
		datos.getChildren().add(descColumn);
		
		HtmlOutputText descOutput = new HtmlOutputText();
		descOutput.setValueExpression("value", createValueExpression("#{item.descripcionconvenio}", String.class));
		descColumn.getChildren().add(descOutput);
		
		/*
		 * 
		 */
		
		HtmlColumn repreColumn = new HtmlColumn();
		datos.getChildren().add(repreColumn);
		
		HtmlOutputText repreOutput = new HtmlOutputText();
		repreOutput.setValueExpression("value", createValueExpression("#{item.representanteconvenio}", String.class));
		repreColumn.getChildren().add(repreOutput);
		
		/*
		 * 
		 */
		
		HtmlColumn fechaIniColumn = new HtmlColumn();
		datos.getChildren().add(fechaIniColumn);
		
		HtmlOutputText fechaIniOutput = new HtmlOutputText();
		fechaIniOutput.setValueExpression("value", createValueExpression("#{item.fechaingreso}", Date.class));
		fechaIniColumn.getChildren().add(fechaIniOutput);
		
		/*
		 * 
		 */
		HtmlColumn fechaFinColumn = new HtmlColumn();
		datos.getChildren().add(fechaFinColumn);
		
		HtmlOutputText fechaFinOutput = new HtmlOutputText();
		fechaFinOutput.setValueExpression("value", createValueExpression("#{item.periododuracion}", Date.class));
		fechaFinColumn.getChildren().add(fechaFinOutput);

	}
	
	private ValueExpression createValueExpression(String valueExpression,Class<?> valueType)
	{
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		return facesContext.getApplication().getExpressionFactory().createValueExpression(facesContext.getELContext(),valueExpression, valueType);
	}
	
	public  String generarReporte() 
	{
		
		// step 1: creation of a document-object
		Document document = new Document();
		try {
			// step 2:
			// we create a writer
			PdfWriter.getInstance(
			// that listens to the document
					document,
					// and directs a PDF-stream to a file
					new FileOutputStream("Reporte2.pdf"));
			
			Font font=new Font(Font.COURIER, 16, Font.BOLDITALIC, Color.blue);
			
			// step 3: we open the document
			document.open();
			  Image img=Image.getInstance("images\\logo.jpg");
	          img.setAlignment(Image.ALIGN_CENTER);
	          document.add(img);
			
			// step 4: we add a table to the document
			  
	          
	          
	          
			PdfPTable table = new PdfPTable(6);
			PdfPCell cell = new PdfPCell(new Paragraph("Reporte de los convenios realizados.",font));
			cell.setColspan(6);

			table.addCell(cell);

						
			for(int i=0;i< 1;i++)
			{
				table.addCell("Cod convenio");
				table.addCell("Agencia");
				table.addCell("NIT");
				table.addCell("Representante");
				table.addCell("Fecha inicio");
				table.addCell("Fecha fin");
			}
			
			
			String resu="";
			int resu2=0;
			String resu1="";
			String resu3="";
			Date resu5;
			Date resu4;
	    	
	    	for(int i=0; i<convenios.size(); i++)
	    	{
	    		resu=convenios.get(i).getIdconvenio()+"";
	    		table.addCell(resu);
	    		
	    		resu1=convenios.get(i).getNombreagencia();
	    		table.addCell(resu1+"");
	    		
	    		resu2=convenios.get(i).getNit();
	    		table.addCell(resu2+"");
	    		
	    		resu3=convenios.get(i).getRepresentanteconvenio();
	    		table.addCell(resu3);
	    		
	    		resu4=convenios.get(i).getFechaingreso();
	    		table.addCell(resu4+"");
	    		
	    		resu5 = convenios.get(i).getPeriododuracion();
	    		table.addCell(resu5+"");
	    	}
			
			document.add(table);
			
		} catch (DocumentException de) {
			System.err.println(de.getMessage());
		} catch (IOException ioe) {
			System.err.println(ioe.getMessage());
		}

		// step 5: we close the document
		document.close();
		
		Desktop d = Desktop.getDesktop();
        if(Desktop.isDesktopSupported())
        {
            
           try 
           {
        	   d.open(new File("Reporte2.pdf"));
		   } 
           catch (IOException ex) 
           {					
        	   ex.printStackTrace();
           }
        }
		return "";
	}
	
}
